{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#初识pytorch\n",
    "import torch\n",
    "import time\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpu 0.5167407989501953 tensor(1.00000e+05 *\n",
      "       1.4151)\n"
     ]
    }
   ],
   "source": [
    "a = torch.randn(100000,1000)\n",
    "b = torch.randn(1000,200)\n",
    "t1 = time.time()\n",
    "c = torch.matmul(a,b)\n",
    "t2 = time.time()\n",
    "print(a.device, t2 - t1,c.norm(2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 2,  3])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.tensor([2,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 2.3000,  3.0000,  3.0000], dtype=torch.float64)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#numpy\n",
    "q = np.array([2.3,3,3])\n",
    "p = np.ones([2,3])\n",
    "torch.from_numpy(p)\n",
    "torch.from_numpy(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 1,  2,  3],\n",
       "        [ 2,  3,  4]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#list tensor只有一个参数\n",
    "torch.tensor([1,2])\n",
    "torch.tensor([[1,2,3],[2,3,4]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0.0000e+00, -2.6844e+08,  0.0000e+00, -2.6844e+08],\n",
       "         [ 2.0667e+09,  3.2707e+04,  2.0668e+09,  3.2707e+04],\n",
       "         [ 2.0668e+09,  3.2707e+04,  0.0000e+00,  3.0000e+00]],\n",
       "\n",
       "        [[ 0.0000e+00,  0.0000e+00,  2.0279e+09,  3.2707e+04],\n",
       "         [ 0.0000e+00, -2.6844e+08,  0.0000e+00, -2.6844e+08],\n",
       "         [ 3.0000e+00,  0.0000e+00,  0.0000e+00,  1.0000e+00]]], dtype=torch.int32)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#uninitialized\n",
    "torch.empty(2)\n",
    "torch.Tensor([1,2])#Tensor有多个参数时表示size\n",
    "torch.IntTensor(2,3,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 6.,  9.,  3.],\n",
       "        [ 2.,  7.,  5.],\n",
       "        [ 6.,  9.,  7.]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#rand\n",
    "a = torch.rand(2,3)\n",
    "torch.rand_like(a)\n",
    "torch.randint(1,10,[3,3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 1.5418, -0.7873, -0.3838, -0.8312, -0.8709, -1.1153, -0.5277,\n",
       "        -0.2725,  0.0039,  0.0492])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#randn normal\n",
    "torch.randn(2,3)\n",
    "torch.normal(torch.full([10],0),torch.arange(1,0,-0.1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 7.,  7.,  7.],\n",
       "        [ 7.,  7.,  7.]])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#full\n",
    "torch.full([10],7)\n",
    "torch.full([2,3],7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 1.,  3.,  5.,  7.,  9.])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#arange range包含end arange不包含end\n",
    "torch.arange(1,10)\n",
    "torch.arange(1,10,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,\n",
       "         10.])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.range(0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "torch.set_default_tensor_type(torch.DoubleTensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 1.0000e+00,  2.1544e+03,  4.6416e+06,  1.0000e+10])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#linspace logspace\n",
    "torch.linspace(0,10,steps=4)\n",
    "#tensor([  0.0000,   3.3333,   6.6667,  10.0000])\n",
    "torch.logspace(0,10,steps=4)#10的多少次方"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 1.,  0.,  0.,  0.],\n",
       "        [ 0.,  1.,  0.,  0.],\n",
       "        [ 0.,  0.,  1.,  0.]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#ones zeros\n",
    "torch.ones([3,3])\n",
    "torch.zeros([3,3])\n",
    "torch.eye(3,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 3,  5,  1,  6,  8,  9,  4,  7,  0,  2])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#randperm\n",
    "torch.randperm(10)#range之后再shuffle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 1, 28, 28])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#索引和切片\n",
    "a = torch.Tensor(4,3,28,28)\n",
    "a[...,:26].shape\n",
    "a[:,2:,:,:].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 3, 10, 28])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#index_select\n",
    "b = torch.Tensor(4,3,28,28)\n",
    "b.index_select(0,torch.tensor([0,2])).shape\n",
    "b.index_select(2,torch.arange(10).long()).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-0.2380, -2.4434,  0.2223])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#select by mask 铺平之后为1的index对应的地方取值\n",
    "c = torch.randn(4,3,28,28)\n",
    "mask = c.ge(0.5)\n",
    "torch.masked_select(c,mask).shape\n",
    "torch.take(c,torch.tensor([2,5,8]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.5968,  0.3332,  0.4461,  ...,  0.0480,  0.7832,  0.2061],\n",
       "        [ 0.8994,  0.3544,  0.6772,  ...,  0.6867,  0.5363,  0.0773],\n",
       "        [ 0.7549,  0.3362,  0.7810,  ...,  0.5065,  0.9984,  0.1730],\n",
       "        [ 0.3782,  0.9534,  0.0392,  ...,  0.0243,  0.0321,  0.3834]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#rand是生成均匀分布,而randn是生成均值为0,方差为1的正态分布\n",
    "d = torch.rand([4,1,28,28])\n",
    "d.view(4,28*28)#会丢失size信息\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 28, 28])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#squeeze 和 unsqueeze\n",
    "e = torch.rand([4,1,28,28])\n",
    "torch.unsqueeze(e,1).shape#类似于tf.expand\n",
    "torch.squeeze(e,1).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 32, 3, 6])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#expand expand_as\n",
    "#扩展某个size为1的维度。如(2,2,1)扩展为(2,2,3)\n",
    "a = torch.randn(1,32,1,1)\n",
    "# a.expand(-1,4,-1,-1).shape\n",
    "'''\n",
    "tensor([[[ 0.0608],\n",
    "         [ 2.2106]],\n",
    " \n",
    "        [[-1.9287],\n",
    "         [ 0.8748]]])\n",
    "tensor([[[ 0.0608,  0.0608,  0.0608],\n",
    "         [ 2.2106,  2.2106,  2.2106]],\n",
    " \n",
    "        [[-1.9287, -1.9287, -1.9287],\n",
    "'''\n",
    "a.expand(4,32,3,6).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 1024, 1, 1])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#repeat\n",
    "f = torch.randn(1,32,1,1)\n",
    "f.repeat(4,32,1,1).shape#相当于重复多少倍"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 1.,  1.],\n",
       "        [ 1.,  1.],\n",
       "        [ 1.,  1.]])"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.t()#显示所有size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([4, 3, 32, 32])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 32, 32, 3])"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#transpose permute\n",
    "print(a.shape)\n",
    "a = torch.randn(4,3,32,32)\n",
    "a.transpose(1,3).contiguous().view(4,3*32*32).view(4,32,32,3).transpose(1,3).shape\n",
    "#contiguous：view只能用在contiguous的variable上。\n",
    "#如果在view之前用了transpose, permute等，需要用contiguous()来返回一个contiguous copy。 \n",
    "a.permute(0,2,3,1).shape#transpose多个维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[  0.0000,   1.3333,   2.6667,   4.0000],\n",
       "        [ 13.3333,  14.6667,  16.0000,  17.3333],\n",
       "        [ 26.6667,  28.0000,  29.3333,  30.6667],\n",
       "        [ 40.0000,  41.3333,  42.6667,  44.0000]])"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#broadcast\n",
    "a = np.linspace(0,40,4)\n",
    "b = np.linspace(0,4,4)\n",
    "t1 = torch.tensor([a])\n",
    "t2 = torch.tensor([b])\n",
    "t1 = t1.transpose(1,0)\n",
    "torch.add(t1,t2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([9, 32, 8])"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#cat 不创建新的维度 就在原来的基础上加\n",
    "a = torch.rand(4,32,8)\n",
    "b = torch.rand(5,32,8)\n",
    "torch.cat([a,b],dim=0).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 3, 2, 16, 32])"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#stack 创建一个新的维度\n",
    "a1 = torch.rand(4,3,16,32)\n",
    "a2 = torch.rand(4,3,16,32)\n",
    "torch.stack([a1,a2],dim=2).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 1, 16, 32])"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#split(size,dim) by len\n",
    "aa,bb = a1.split(2,dim=1)\n",
    "aa.shape\n",
    "bb.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([2, 3, 16, 32])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#chunk by size\n",
    "aa,bb = a1.split(2,dim=0)\n",
    "aa.shape\n",
    "bb.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 3, 28, 32])"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#matmul mm(for 2d)\n",
    "a = torch.rand(4,3,28,64)\n",
    "b = torch.rand(4,3,64,32)\n",
    "torch.matmul(a,b).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([4, 3, 28, 32])"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#??\n",
    "a = torch.rand(4,3,28,64)\n",
    "b = torch.rand(4,1,64,32)\n",
    "torch.matmul(a,b).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#pow\n",
    "a = torch.rand(2,3)\n",
    "b = a.pow(2)\n",
    "c = b.sqrt()\n",
    "d = b.rsqrt()#返回平方根的倒数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 1.,  1.],\n",
       "        [ 1.,  1.]])"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#exp log\n",
    "a = torch.exp(torch.ones(2,2))\n",
    "b = torch.log(a)\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[  6.6547,   6.0000,  13.2827],\n",
       "        [  6.0000,   6.0000,  11.6300]])"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#floor() ceil() round() trunc() frac()\n",
    "#向下取整 向上取整 四舍五入 截断 取小数\n",
    "#clamp\n",
    "grad = torch.rand(2,3)*15\n",
    "grad.max()\n",
    "grad.median()\n",
    "grad.clamp(6)#将数字限定在一个范围 单个参数的话相当于floor  两个参数就是floor和ceil"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 1.4142,  1.4142],\n",
       "        [ 1.4142,  1.4142]])"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#统计属性 statistics\n",
    "#norm求范数\n",
    "a = torch.ones(8)\n",
    "a.norm(2)\n",
    "b = a.view(4,2)\n",
    "c = a.view(2,2,2)\n",
    "b.norm(2,dim=1)\n",
    "c.norm(2,dim=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.,  1.,  2.,  3.],\n",
       "        [ 4.,  5.,  6.,  7.]])"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max mean sum argmax\n",
    "a = torch.arange(8).view(2,4)\n",
    "m,index = a.min(dim=1)\n",
    "a.sum()\n",
    "a.argmax(dim=1)#返回最大值的index 无参数时返回铺平后的最大值index\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([ 0.9538,  0.7321,  1.2935,  0.6755]), tensor([ 8,  3,  6,  5]))"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#dim keep_dim\n",
    "a = torch.randn(4,10)\n",
    "a.max(dim=1)\n",
    "a.argmax(dim=1,keepdim=True)\n",
    "a.topk(3,dim=1)\n",
    "a.topk(3,dim=1,largest=False)\n",
    "a.kthvalue(8,dim=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = torch.ones(2,3)\n",
    "b = torch.randn(2,3)\n",
    "torch.eq(a,a)#matrix size 0 or 1\n",
    "torch.equal(a,a)#True or False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 0.,  0.,  0.],\n",
       "        [ 1.,  0.,  1.]])"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#高阶op\n",
    "#where\n",
    "cond = torch.randn(2,3)\n",
    "a = torch.ones(2,3)\n",
    "b = torch.zeros(2,3)\n",
    "res = torch.where(cond>0.5,a,b)#if cond a else b\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 109.,  107.,  104.],\n",
       "        [ 104.,  101.,  106.],\n",
       "        [ 105.,  108.,  107.],\n",
       "        [ 100.,  103.,  104.]])"
      ]
     },
     "execution_count": 204,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#gather 抓取\n",
    "a = torch.randn(4,10)\n",
    "idx = a.topk(3,dim=1)[1]\n",
    "inputs = torch.arange(0,10)+100\n",
    "torch.gather(inputs.expand(4,10),dim=1,index=idx)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,\n",
       "         0.5047,  0.6514,  0.7616])"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#激活函数\n",
    "#sigmoid o 导数o(1-o)\n",
    "#tanh 导数 1-tanh^2\n",
    "a = torch.linspace(1,10,steps=10)\n",
    "torch.sigmoid(a)\n",
    "b = torch.linspace(-1,1,steps=10)\n",
    "torch.tanh(b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.1111,  0.3333,\n",
       "         0.5556,  0.7778,  1.0000])"
      ]
     },
     "execution_count": 215,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch.nn.functional as F\n",
    "a = torch.linspace(-1,1,10)\n",
    "torch.relu(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.1111,  0.3333,\n",
       "         0.5556,  0.7778,  1.0000])"
      ]
     },
     "execution_count": 216,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "F.relu(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 251,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.6014],\n",
      "        [ 0.4385],\n",
      "        [ 0.7116],\n",
      "        [ 0.2504]])\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "#auto grad\n",
    "x = torch.randn(10,4)\n",
    "y = torch.rand(4,1)\n",
    "print(y)\n",
    "torch.set_default_tensor_type(torch.FloatTensor)\n",
    "c = torch.tensor([[1.,1.,1.,1.,1.,0.,0.,0.,0.,0.]])\n",
    "y.requires_grad_()\n",
    "mse = F.mse_loss(c.transpose(1,0),torch.matmul(x,y))\n",
    "#两种求梯度的方式 \n",
    "#autograd.grad(loss,[w1,w2,...])\n",
    "#loss.backward() w1.grad w2.grad...\n",
    "\n",
    "#torch.autograd.grad(mse,[y])\n",
    "#mse.backward()\n",
    "print(y.grad)\n",
    "# torch.autograd.grad(mse,[y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([-0.0839,  0.2040, -0.1201]),)"
      ]
     },
     "execution_count": 270,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#softmax\n",
    "a = torch.rand(3)\n",
    "a.requires_grad_()\n",
    "p = F.softmax(a,dim=0)\n",
    "#p.backward()\n",
    "torch.autograd.grad(p[0],[a],retain_graph=True)\n",
    "torch.autograd.grad(p[1],[a])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(1.00000e-02 *\n",
       "       [[-0.8643, -1.2534, -0.4541, -0.2793, -1.1646, -0.6697, -1.2836,\n",
       "         -0.4158, -0.2457, -0.9474]])"
      ]
     },
     "execution_count": 280,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#单输出的感知机\n",
    "x = torch.rand(1,10)\n",
    "w = torch.rand(1,10,requires_grad=True)\n",
    "o = torch.sigmoid(x@w.t())\n",
    "p = F.mse_loss(torch.ones(1,1),o)\n",
    "p.backward()\n",
    "w.grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 284,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(1.00000e-03 *\n",
       "       [[-1.8835, -2.8279, -8.5346, -6.1455, -4.8173, -8.6635, -3.9107,\n",
       "         -5.2868, -6.5046, -1.4916],\n",
       "        [-0.2321, -0.3485, -1.0518, -0.7574, -0.5937, -1.0677, -0.4819,\n",
       "         -0.6515, -0.8016, -0.1838]])"
      ]
     },
     "execution_count": 284,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#多输出的感知机\n",
    "x = torch.rand(1,10)\n",
    "w = torch.rand(2,10,requires_grad=True)\n",
    "o = torch.sigmoid(x@w.t())\n",
    "p = F.mse_loss(torch.ones(1,2),o)\n",
    "p.backward()\n",
    "w.grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 331,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[  9.1058,   8.1987,  15.4877,   1.1411,   9.0638,   6.5745,\n",
       "           3.9227,   8.3358,   3.9339,  15.1633,   2.5644,  11.5374,\n",
       "          14.8297,   4.1587,  15.4504,   8.5591,   6.2904,  10.9190,\n",
       "          10.7761,  12.1088],\n",
       "        [ 25.1896,  22.6800,  42.8437,   3.1567,  25.0733,  18.1870,\n",
       "          10.8515,  23.0594,  10.8824,  41.9463,   7.0940,  31.9160,\n",
       "          41.0235,  11.5044,  42.7406,  23.6770,  17.4013,  30.2054,\n",
       "          29.8100,  33.4967],\n",
       "        [ 30.3117,  27.2919,  51.5556,   3.7986,  30.1718,  21.8853,\n",
       "          13.0580,  27.7484,  13.0952,  50.4758,   8.5366,  38.4059,\n",
       "          49.3653,  13.8437,  51.4316,  28.4916,  20.9398,  36.3474,\n",
       "          35.8716,  40.3080],\n",
       "        [  5.7527,   5.1796,   9.7845,   0.7209,   5.7262,   4.1535,\n",
       "           2.4782,   5.2662,   2.4853,   9.5796,   1.6201,   7.2889,\n",
       "           9.3688,   2.6273,   9.7610,   5.4073,   3.9741,   6.8982,\n",
       "           6.8079,   7.6499],\n",
       "        [ 19.7460,  17.7788,  33.5849,   2.4745,  19.6548,  14.2567,\n",
       "           8.5064,  18.0761,   8.5306,  32.8815,   5.5610,  25.0188,\n",
       "          32.1580,   9.0182,  33.5041,  18.5603,  13.6408,  23.6778,\n",
       "          23.3679,  26.2578],\n",
       "        [  1.6275,   1.4653,   2.7681,   0.2040,   1.6200,   1.1751,\n",
       "           0.7011,   1.4899,   0.7031,   2.7101,   0.4583,   2.0621,\n",
       "           2.6505,   0.7433,   2.7614,   1.5298,   1.1243,   1.9516,\n",
       "           1.9260,   2.1642],\n",
       "        [ 32.0185,  28.8286,  54.4586,   4.0125,  31.8707,  23.1176,\n",
       "          13.7933,  29.3108,  13.8326,  53.3180,   9.0172,  40.5685,\n",
       "          52.1450,  14.6232,  54.3275,  30.0959,  22.1189,  38.3941,\n",
       "          37.8915,  42.5776],\n",
       "        [ 11.7500,  10.5794,  19.9849,   1.4725,  11.6957,   8.4836,\n",
       "           5.0618,  10.7563,   5.0762,  19.5663,   3.3091,  14.8876,\n",
       "          19.1359,   5.3664,  19.9368,  11.0444,   8.1171,  14.0896,\n",
       "          13.9052,  15.6249],\n",
       "        [ 30.9389,  27.8565,  52.6223,   3.8772,  30.7960,  22.3380,\n",
       "          13.3282,  28.3225,  13.3662,  51.5201,   8.7132,  39.2005,\n",
       "          50.3866,  14.1301,  52.4956,  29.0811,  21.3730,  37.0994,\n",
       "          36.6138,  41.1419],\n",
       "        [ 27.2868,  24.5683,  46.4106,   3.4195,  27.1608,  19.7012,\n",
       "          11.7549,  24.9792,  11.7884,  45.4385,   7.6846,  34.5732,\n",
       "          44.4389,  12.4622,  46.2989,  25.6483,  18.8501,  32.7201,\n",
       "          32.2918,  36.2854]])"
      ]
     },
     "execution_count": 331,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.rand(1,10)\n",
    "w1 = torch.rand(10,20,requires_grad=True)\n",
    "b1 = torch.ones(1,20)\n",
    "w2 = torch.rand(20,1,requires_grad=True)\n",
    "b2 = torch.ones(1)\n",
    "\n",
    "y1 = torch.matmul(x,w1)+b1\n",
    "y2 = torch.matmul(y1,w2)+b2\n",
    "\n",
    "# dy1_dw1 = torch.autograd.grad(y1,[w1],retain_graph=True)\n",
    "# dy2_dy1 = torch.autograd.grad(y2,[y1],retain_graph=True)\n",
    "loss = F.mse_loss(torch.ones(1),y2)\n",
    "loss.backward()\n",
    "w1.grad"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x,y range: (120,) (120,)\n",
      "X,Y maps: (120, 120) (120, 120)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import  numpy as np\n",
    "from    mpl_toolkits.mplot3d import Axes3D\n",
    "from    matplotlib import pyplot as plt\n",
    "import  torch\n",
    "\n",
    "\n",
    "\n",
    "def himmelblau(x):\n",
    "    return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2\n",
    "\n",
    "\n",
    "x = np.arange(-6, 6, 0.1)\n",
    "y = np.arange(-6, 6, 0.1)\n",
    "print('x,y range:', x.shape, y.shape)\n",
    "X, Y = np.meshgrid(x, y)\n",
    "print('X,Y maps:', X.shape, Y.shape)\n",
    "Z = himmelblau([X, Y])\n",
    "\n",
    "fig = plt.figure('himmelblau')\n",
    "ax = fig.gca(projection='3d')\n",
    "ax.plot_surface(X, Y, Z)\n",
    "ax.view_init(60, -30)\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step: 0 x = [-1.000499963760376, 0.0004999999655410647] f(x)= 164.0\n",
      "step: 2000 x = [-2.0577282905578613, 1.1667312383651733] f(x)= 90.62757110595703\n",
      "step: 4000 x = [-2.718446731567383, 2.2497518062591553] f(x)= 23.560373306274414\n",
      "step: 6000 x = [-2.8020339012145996, 2.960942506790161] f(x)= 1.1088749170303345\n",
      "step: 8000 x = [-2.805062770843506, 3.1294891834259033] f(x)= 0.00013457478780765086\n",
      "step: 10000 x = [-2.805114507675171, 3.131300210952759] f(x)= 6.4437699620611966e-09\n",
      "step: 12000 x = [-2.805116891860962, 3.131308078765869] f(x)= 8.440110832452774e-10\n",
      "step: 14000 x = [-2.8051178455352783, 3.1313109397888184] f(x)= 9.913492249324918e-11\n",
      "step: 16000 x = [-2.8051180839538574, 3.131312131881714] f(x)= 5.6843418860808015e-12\n",
      "step: 18000 x = [-2.8051180839538574, 3.131312370300293] f(x)= 2.2737367544323206e-13\n",
      "step: 20000 x = [-2.8051180839538574, 3.131312370300293] f(x)= 2.2737367544323206e-13\n",
      "step: 22000 x = [-2.8051180839538574, 3.131312608718872] f(x)= 2.2737367544323206e-13\n",
      "step: 24000 x = [-2.805126667022705, 3.131312847137451] f(x)= 2.9524471756303683e-09\n",
      "step: 26000 x = [-2.8051185607910156, 3.131312370300293] f(x)= 3.092281986027956e-11\n",
      "step: 28000 x = [-2.8051199913024902, 3.131312370300293] f(x)= 1.8917489796876907e-10\n"
     ]
    }
   ],
   "source": [
    "x = torch.tensor([-1.0,0.0],requires_grad=True)\n",
    "optimizer = torch.optim.Adam([x],lr=5e-4)\n",
    "for step in range(30000):\n",
    "    optimizer.zero_grad()\n",
    "    pred = himmelblau(x)\n",
    "    pred.backward()\n",
    "    optimizer.step()\n",
    "    \n",
    "    if step%2000 == 0:\n",
    "        print('step: {} x = {} f(x)= {}'.format(step,x.tolist(),pred.item()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
